import { is } from '@electron-toolkit/utils'
import { BrowserWindow, BrowserWindowConstructorOptions, shell } from 'electron'
import { join } from 'path'
import icon from '../../resources/icon.png?asset'
import url from 'node:url'

// Partial工具，包裹类型的全部属性变成可选项
export interface OptionsType extends Partial<BrowserWindowConstructorOptions> {
  openDevTools?: boolean
  hash?: string
}

export function createWindow(options: OptionsType): BrowserWindow {
  // 获取主屏幕的宽度和高度
  // const { width } = screen.getPrimaryDisplay().workAreaSize
  // Create the browser window.
  const win = new BrowserWindow(
    Object.assign(
      {
        width: 500,
        height: 400,
        center: true,
        show: false,
        frame: false, //这个属性是是否可拖拽, windows系统需要将这个属性设置为false，transparent设置成true才能生效。可以使用css实现拖拽
        transparent: true, // 窗口透明
        alwaysOnTop: true, // 窗口置顶
        autoHideMenuBar: true,
        ...(process.platform === 'linux' ? { icon } : {}),
        webPreferences: {
          preload: join(__dirname, '../preload/index.js'),
          sandbox: false
        }
      },
      options
    )
  )

  // 忽略鼠标事件,这个项目不可取,会导致所有鼠标事件失效。这个方案可能适合做壁纸软件，看得到交互不了
  // win.setIgnoreMouseEvents(true, { forward: true })

  // 开启调试工具
  if (is.dev && options.openDevTools) win.webContents.openDevTools()

  win.on('ready-to-show', () => {
    win.show()
  })

  win.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url)
    return { action: 'deny' }
  })

  // HMR for renderer base on electron-vite cli.
  // Load the remote URL for development or the local html file for production.
  // if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
  //   win.loadURL(process.env['ELECTRON_RENDERER_URL'])
  // } else {
  //   // 这里不用修改成loadURL,因为它的路由时 / ,所以直接用loadFile也行。
  //   win.loadFile(join(__dirname, '../renderer/index.html'))
  // }

  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    // 注意这里开发环境中要 + /#config ，用来匹配react-router-dom中定义的路由
    win.loadURL(process.env['ELECTRON_RENDERER_URL'] + options.hash)
    // win.loadURL(process.env['ELECTRON_RENDERER_URL'] + '/#config')
  } else {
    // win.loadFile(join(__dirname, '../renderer/index.html'))
    // 编译后改为加载URL的方式，因为配置了路由，所以这里要加载URL而不是文件。

    win.loadURL(
      url.format({
        // 编译后的文件
        pathname: join(__dirname, '../renderer/index.html'),
        // 协议
        protocol: 'file',
        // protocol 后面需要两个/
        slashes: true,
        // 路由路径，要和react-router-dom定义的路由匹配
        hash: options.hash?.substring(1)
      })
    )
  }

  return win
}
